package view;

import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;
import javax.swing.Timer;

import model.ChatModel;
import controller.ChatListener;

/**
 * Die Vaterklasse aller Implementierungen des ChatContainer-Interfaces via
 * JPanel. Kindklassen muessen fuer die Chatimplementierung lediglich die
 * Methode {@link #computeChatRect()} definieren.
 * 
 * @author Simon Wirth, Kilian Telschig
 * @see ChatContainer
 */
public abstract class AbstractChatContainerPanel extends JPanel implements ChatContainer {
	/**  */
	private static final long serialVersionUID = 1L;
	/**
	 * Das zu verwendende <code>ChatModel</code>
	 * 
	 * @see ChatModel
	 */
	private ChatModel chat;

	/**
	 * Speichert die Referenz auf das zu benutzende <code>ChatModel</code><br/>
	 * und erstellt sowie verbindet den <code>ChatContainer</code> mit einem<br/>
	 * <code>ChatListener</code>
	 * 
	 * @param c
	 *            das zu benutzende <code>ChatModel</code>
	 * @see ChatContainer
	 * @see controller.ChatListener
	 * @see model.ChatModel
	 */
	public AbstractChatContainerPanel(ChatModel c) {

		this.chat = c;
		super.setFocusable(true);

		ChatListener cl = new ChatListener(chat, this);
		addMouseWheelListener(cl);
		addMouseListener(cl);
		addMouseMotionListener(cl);
		addKeyListener(cl);
		//TODO vor export entfernen
		c.addOutput(c);

		new Timer(550, new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				AbstractChatContainerPanel.this.repaint(chat.getEditorBounds(computeChatRect()));
			}
		}).start();
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Rectangle r = computeChatRect();
		chat.zeichneChat(g, r.x, r.y, r.width, r.height);
	}
}
